package gerador;

import gerador.painel.Gerarpainel;

import java.util.ArrayList;
import java.util.List;

import scr.BuscaTabelas;
import scr.Coluna;
import scr.Lista;
import scr.Tabela;

public class Iniciar3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		List<Tabela> tabelas = BuscaTabelas.iniciar();
		List<Lista> listas = new ArrayList<Lista>();

		for (Tabela tabela : tabelas) {
			String metodo = "";
			String declaracao = "";
			if (tabela.getNomeBanco().contains("_m_")) {
				criaLista(listas, tabela);
				continue;

			}
		}

		for (Tabela tabela : tabelas) {

			int altura = 70;
			List<String> tela = new ArrayList<String>();
			List<String> model = new ArrayList<String>();
			List<String> dao = new ArrayList<String>();
			List<String> componenetes = new ArrayList<String>();
			if (tabela.getNomeBanco().contains("_m_")) {
				criarModelLista(tabela, model,criaLista(tabela));

				criarDAOLista(tabela, dao, criaLista(tabela));
				continue;
			}

			criarModel(tabela, model,listas);

			criarDAO(tabela, dao, listas);
			
			Gerarpainel.iniciar(tabelas);

		}// fim tabela
	}

	
	
	
	
	
	
	
	private static void criarDAOLista(Tabela tabela, List<String> dao, Lista l) {
		dao.add("package revert.dao;");
		dao.add("");
		dao.add("import revert.model."+ l.getModel() + ";");
		dao.add("import revert.dao."+ l.getModel() + "DAO;");
		dao.add("import java.util.ArrayList;");
		dao.add("import java.util.List;");
		dao.add("import conexao.Conexao;");
		dao.add("import java.sql.SQLException;");
		dao.add("import java.text.ParseException;");
		dao.add("import uteis.Constantes;");
		dao.add("import uteis.DatasUteis;");
		
		dao.add("import xml.LeXML;");
		dao.add("import revert.model." + tabela.getNome() + ";");
		dao.add("");
		dao.add("public class " + tabela.getNome() + "DAO {");
		dao.add("");
		dao.add("public static void insert(" + tabela.getNome() + " "+ tabela.getNomeBanco() + "){");
		dao.add("  Conexao con = new Conexao();");
		dao.add("  LeXML.ler();");
		dao.add("  try {");
		dao.add("    con.conectar(Constantes.base, Constantes.local, Constantes.user,Constantes.senha);");
		dao.add("      insertCon(" + tabela.getNomeBanco() + ", con);");
		dao.add("      con.commit();");
		dao.add("  } catch (Exception e) {");
		dao.add("    try {");
		dao.add("      con.rollback();");
		dao.add("    } catch (SQLException e1) {");
		dao.add("      e1.printStackTrace();");
		dao.add("    }");
		dao.add("  e.printStackTrace();");
		dao.add("  }finally{");
		dao.add("    con.desconectar();");
		dao.add("  }	");
		dao.add("}");
		dao.add("");
		dao.add("public static void insertCon(" + tabela.getNome() + " "+ tabela.getNomeBanco() + ",Conexao con ) throws SQLException , ParseException, java.text.ParseException{");
		dao.add("	con.pst = con.conn");
		String inicio = "INSERT INTO " + tabela.getNomeBanco() + "(";
		String fim = ") VALUES(";
		String update = "UPDATE " + tabela.getNomeBanco() + " SET ";
		String select = "";
		for (Coluna c : tabela.getColunas()) {
			if (c.isChave() && c.getNomeBanco().equalsIgnoreCase("id")) {
				select = c.getNomeBanco() + ",";
				continue;
			}
			inicio = inicio + c.getNomeBanco() + ",";
			fim = fim + "?,";
			update = update + c.getNomeBanco() + " = ? ,";

		}
		select = select+ inicio.replace("INSERT INTO " + tabela.getNomeBanco() + "(","");
		select = select.substring(0, select.length() - 1);
		fim = fim.substring(0, fim.length() - 1) + ");";
		inicio = inicio.substring(0, inicio.length() - 1);
		update = update.substring(0, update.length() - 1) + " WHERE id = ";

		String sql = inicio + fim;
		dao.add("					.prepareStatement(\"" + sql + "\");");
		int cont = 0;
		boolean id = false;
		for (Coluna c : tabela.getColunas()) {
			cont++;
			dao.add("			con.pst.setInt(" + cont + ", " + tabela.getNomeBanco()
					+ ".get" + c.getNomeSet() + "());");
		}
		dao.add("			System.out.println(con.pst.toString());");
		dao.add("			con.pst.executeUpdate();");
		dao.add("	}");
		dao.add("	");

		/**
		 * Aqyui abixo select
		 */

		dao.add("	");
		dao.add("	");
		dao.add("	public static List<" + l.getModel() + "> select(int id) {");
		dao.add("		List<" + l.getModel() + "> list" + l.getModel() + " = new ArrayList<" + l.getModel() + ">();");
		dao.add("		List<" + l.getModel() + "> lista = new ArrayList<" + l.getModel() + ">();");
		dao.add("		LeXML.ler();");
		dao.add("			Conexao con = new Conexao();");
		dao.add("			try {");
		dao.add("");
		dao
				.add("				con.conectar(Constantes.base, Constantes.local, Constantes.user,");
		dao.add("					Constantes.senha);");
		dao.add("				con.pst = con.conn.prepareStatement(\"select " + select
				+ " from " + tabela.getNomeBanco()
				+ " where "+l.getTabelaF().getColunas().get(0).getNomeBanco()+" = \" + id+\";\");");
		dao.add("				con.rs = con.pst.executeQuery();");
		dao.add("				System.out.println(\"SQL--> \"+con.pst.toString());");
		dao.add("				while (con.rs.next()) {");
		dao.add("					" +l.getModel() + " aux = new " + l.getModel() + "();");
		dao.add("					aux.setId(con.rs.getInt(2));");
		dao.add("					list" + l.getModel() + ".add(aux);");
		dao.add("				}");
		
		
		dao.add("				for (" + l.getModel() + " aux : list" + l.getModel() + ") {");
		dao.add("					aux = " + l.getModel() + "DAO.select(aux.getId());");
		dao.add("					lista.add(aux);");				
		dao.add("				}");

		dao.add("		} catch (SQLException e) {");
		dao.add("			e.printStackTrace();");
		dao.add("		} catch (Exception e) {");
		dao.add("				e.printStackTrace();");
		dao.add("		} finally {");
		dao.add("				con.desconectar();");
		dao.add("		}");
		dao.add("		return lista;");
		dao.add("	}");
		dao.add("	");
		dao.add("	");

				
				
		 /**
		 * delete
		 */
				
		
		 dao.add(" public static void delete(int id) {");
		 dao.add(" LeXML.ler();");
		 dao.add(" Conexao con = new Conexao();");
		 dao.add(" try {");
		 dao.add("");
		 dao.add(" con.conectar(Constantes.base, Constantes.local,Constantes.user,");
		 dao.add(" Constantes.senha);");
		 dao.add("deleteCon(id, con);");
		 dao.add("	con.commit();");
		 dao.add("} catch (Exception e) {");
		 dao.add("try {");
		 dao.add("		con.rollback();");
		 dao.add("} catch (SQLException e1) {");
		 dao.add("		e1.printStackTrace();");
		 dao.add("	}");
		 dao.add("	e.printStackTrace();");
		 dao.add("}finally{");
		 dao.add("con.desconectar();");
		 dao.add("}	");
		 dao.add("}");
		 dao.add("");
		 dao.add("	public static void deleteCon(int id,Conexao con) throws SQLException , ParseException, java.text.ParseException {");
		 dao.add("		con.pst = con.conn.prepareStatement(\"delete from "+tabela.getNomeBanco()+" where "+l.getTabelaF().getColunas().get(0).getNomeBanco()+" = \" + id+\";\");");
		 dao.add("		con.pst.executeUpdate();");
		 dao.add("		System.out.println(\"SQL--> \"+con.pst.toString());");
		 dao.add("");
		 dao.add("	}");
		 dao.add("	}");
		GeradorArquivos.criarDAO(tabela.getNome() + "DAO.java", dao);

	}

	private static void criarModelLista(Tabela tabela, List<String> model,
			Lista l) {
		model.add("package revert.model;");
		model.add("");
		model.add("\npublic class " + tabela.getNome() + " {");
		model.add("");
		for (Coluna coluna : tabela.getColunas()) {
			model.add("private Integer " + coluna.getNomeJava() + ";");
		}

		model.add("");

		model.add("\n\npublic " + tabela.getNome() + "() {}");

		for (Coluna coluna : tabela.getColunas()) {
			model.add("");
			model.add(" public Integer get" + coluna.getNomeSet() + "() {");
			model.add("        return " + coluna.getNomeJava() + ";");
			model.add("  }");
			model.add("");
			model.add("  public void set" + coluna.getNomeSet() + "(Integer "
					+ coluna.getNomeJava() + ") {");
			model.add("      this." + coluna.getNomeJava() + " = "
					+ coluna.getNomeJava() + ";");
			model.add("    }");
		}
		model.add("}");
		GeradorArquivos.criarModel(tabela.getNome() + ".java", model);

	}

	private static void criarDAO(Tabela tabela, List<String> dao,List<Lista> listas) {
		dao.add("package revert.dao;");
		dao.add("");
		dao.add("import java.util.ArrayList;");
		dao.add("import java.util.List;");
		dao.add("import conexao.Conexao;");
		dao.add("import java.sql.SQLException;");
		dao.add("import java.text.ParseException;");
		dao.add("import uteis.Constantes;");
		dao.add("import uteis.DatasUteis;");
		dao.add("import xml.LeXML;");
		dao.add("import revert.model."+tabela.getNome()+";");
		dao.add("");
		
		for (Coluna c : tabela.getColunas()) {
			if(c.getForenkey()!=null){
				dao.add("import revert.model."+c.getForenkey().getClasseReferencia()+";");
			}
		}
		for (Lista l : listas) {
			if(l.getClasse().equalsIgnoreCase(tabela.getNomeBanco())){
				dao.add("import revert.model."+l.getModel()+";");
				dao.add("import revert.model."+BuscaTabelas.trocaUnderTabela(l.getTabela())+";");
			}
		}
		
		
		dao.add("public class "+tabela.getNome()+"DAO {");
		dao.add("");
		
		dao.add("public static "+tabela.getNome()+" insert("+tabela.getNome()+" " +tabela.getNomeBanco()+"){");
		dao.add("	Conexao con = new Conexao();");
		dao.add("		LeXML.ler();");
		dao.add("		try {");
		dao.add("				con.conectar(Constantes.base, Constantes.local, Constantes.user,");
		dao.add("						Constantes.senha);");
		dao.add("				" +tabela.getNomeBanco()+" = insertCon(" +tabela.getNomeBanco()+", con);");
		dao.add("				con.commit();");
		dao.add("			} catch (Exception e) {");
		dao.add("			try {");
		dao.add("				" +tabela.getNomeBanco()+" =null;");
		dao.add("					con.rollback();");
		dao.add("		} catch (SQLException e1) {");
		dao.add("				e1.printStackTrace();");
		dao.add("			}");
		dao.add("			e.printStackTrace();");
		dao.add("		}finally{");
		dao.add("		con.desconectar();");
		dao.add("		}	");
		dao.add("       return "+tabela.getNomeBanco()+";");
		dao.add("	}");
		dao.add("	");
			
		dao.add("public static "+tabela.getNome()+" insertCon("+tabela.getNome()+" " +tabela.getNomeBanco()+",Conexao con ) throws SQLException , ParseException, java.text.ParseException{");
		
		for (Coluna c : tabela.getColunas()) {
			if (c.isChave()&& c.getNomeBanco().equalsIgnoreCase("id")){
				continue;
			}
			if (c.getForenkey()!=null){
				dao.add("		if ("+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"()!=null && "+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"().getId() == null) {");
				dao.add("			"+tabela.getNomeBanco()+".set"+c.getForenkey().getClasseReferencia()+"("+c.getForenkey().getClasseReferencia()+"DAO.insertCon("+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"(),con));");
				dao.add("			}");
			}
		}
		dao.add("			con.pst = con.conn");
		
		String inicio = "INSERT INTO "+tabela.getNomeBanco()+"(";
		String fim = ") VALUES(";
		String update = "UPDATE "+tabela.getNomeBanco()+" SET ";
		
		String select ="";
		for (Coluna c : tabela.getColunas()) {
			if (c.isChave()&& c.getNomeBanco().equalsIgnoreCase("id")){
				select = c.getNomeBanco()+",";
				continue;
			}
			inicio = inicio + c.getNomeBanco()+",";
			fim = fim + "?," ;
			update = update + c.getNomeBanco()+" = ? ,";
			
		}
		select = select + inicio.replace("INSERT INTO "+tabela.getNomeBanco()+"(", "");
		select = select.substring(0,select.length()-1);
		fim = fim.substring(0, fim.length()-1)+");";
		inicio = inicio.substring(0, inicio.length()-1);
		update = update.substring(0, update.length()-1) +" WHERE id = " ;
		
		
		
		String sql = inicio + fim;
		System.out.println(sql);
		
		dao.add("					.prepareStatement(\""+sql+"\");");
		
		int cont = 0;
		boolean id = false;
		for (Coluna c : tabela.getColunas()) {
			if (c.isChave() && c.getNomeBanco().equalsIgnoreCase("id")){
				id=true;
				continue;
			}
			cont++;
			if(c.getForenkey()!=null){
				dao.add("			if("+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"()!=null){");
				dao.add("				con.pst.setInt("+cont+", "+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"().getId());");
				dao.add("			}else{");
				dao.add("				con.pst.setNull("+cont+", java.sql.Types.INTEGER);");
				dao.add("			}");
			}else{
				if(c.getTipoDado().contains("char")
						|| c.getTipoDado().contains("text")){
					dao.add("			con.pst.setString("+cont+", "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"());");
				}
				
				else if (c.getTipoDado().contains("boolean")) {
					dao.add("			con.pst.setBoolean("+cont+", "+tabela.getNomeBanco()+".is"+c.getNomeSet()+"());");
				} else if (c.getTipoDado().contains("int")) {
					dao.add("			con.pst.setInt("+cont+", "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"());");
				
				} else if (c.getTipoDado().contains("num")
						|| c.getTipoDado().contains("double")
						|| c.getTipoDado().contains("ARRAY")) {
					
					dao.add("			con.pst.setDouble("+cont+", "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"());");
				} else if (c.getTipoDado().contains("date")) {
					dao.add("			con.pst.setDate("+cont+", DatasUteis.formataData( "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()));");
				} else if( c.getTipoDado().contains("time")){
					dao.add("			con.pst.setTimestamp("+cont+", DatasUteis.formataAgora());");
				}
				
				
			}
		}
		dao.add("			System.out.println(con.pst.toString());");
		dao.add("			con.pst.executeUpdate();");
		if(id){
			dao.add("           con.pst = con.conn.prepareStatement(\"select max(id) from "+tabela.getNomeBanco()+"\");");
			dao.add("           con.rs = con.pst.executeQuery();");
			dao.add("");
			dao.add("      while (con.rs.next()) {");
			dao.add("	      "+tabela.getNomeBanco()+".setId(con.rs.getInt(1));");
			dao.add("      }");
			dao.add("insertMany("+tabela.getNomeBanco()+", con);");
		}
		dao.add("       return "+tabela.getNomeBanco()+";");
		dao.add("	}");
		dao.add("	");
		dao.add("	");
		dao.add("	private static void insertMany("+tabela.getNomeJava()+" "+tabela.getNomeBanco()+", Conexao con) throws SQLException , ParseException, java.text.ParseException{");
		
		for (Lista l : listas) {
			if(l.getClasse().equalsIgnoreCase(tabela.getNomeBanco())){
				dao.add("   if("+tabela.getNomeBanco()+"."+l.getGet()+"!=null && "+tabela.getNomeBanco()+"."+l.getGet()+".size()!=0){");
				dao.add("  		for ("+l.getModel()+" aux : "+tabela.getNomeBanco()+"."+l.getGet()+") {");
				dao.add("  			if(aux.getId()==null){");
				dao.add(" 				aux = "+l.getModel()+"DAO.insertCon(aux, con);");
				dao.add(" 			}");
				dao.add(" 			"+BuscaTabelas.trocaUnderTabela(l.getTabela())+" l = new "+BuscaTabelas.trocaUnderTabela(l.getTabela())+"();");
				if(l.getTabelaF().getColunas()!=null && l.getTabelaF().getColunas().size()!=0){
					dao.add("  			l.set"+l.getTabelaF().getColunas().get(0).getNomeSet()+"("+tabela.getNomeBanco()+".getId());");
					dao.add("  			l.set"+l.getTabelaF().getColunas().get(1).getNomeSet()+"(aux.getId());");
				}
				dao.add("  			"+BuscaTabelas.trocaUnderTabela(l.getTabela())+"DAO.insertCon(l,con);");
				dao.add("  		}");
				dao.add("  	}");
			}
		}
		
		dao.add("	}");
		/**
		 * Aqui update
		 * 
		 */
		
		
		dao.add("public static "+tabela.getNome()+" update("+tabela.getNome()+" " +tabela.getNomeBanco()+"){");
		dao.add("	Conexao con = new Conexao();");
		dao.add("		LeXML.ler();");
		dao.add("		try {");
		dao.add("				con.conectar(Constantes.base, Constantes.local, Constantes.user,");
		dao.add("						Constantes.senha);");
		dao.add("				" +tabela.getNomeBanco()+" = updateCon(" +tabela.getNomeBanco()+", con);");
		dao.add("				con.commit();");
		dao.add("			} catch (Exception e) {");
		dao.add("			try {");
		dao.add("				" +tabela.getNomeBanco()+" =null;");
		dao.add("					con.rollback();");
		dao.add("		} catch (SQLException e1) {");
		dao.add("				e1.printStackTrace();");
		dao.add("			}");
		dao.add("			e.printStackTrace();");
		dao.add("		}finally{");
		dao.add("		con.desconectar();");
		dao.add("		}	");
		dao.add("       return "+tabela.getNomeBanco()+";");
		dao.add("	}");
		dao.add("	");
		
		
		
		dao.add("public static "+tabela.getNome()+" updateCon("+tabela.getNome()+" " +tabela.getNomeBanco()+",Conexao con ) throws SQLException , ParseException, java.text.ParseException{");
		for (Coluna c : tabela.getColunas()) {
			if (c.isChave()&& c.getNomeBanco().equalsIgnoreCase("id")){
				update = update + "\"+"+tabela.getNomeBanco()+".getId()";
			}
			if (c.getForenkey()!=null){
				
				dao.add("		if ("+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"()!=null && "+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"().getId() != null) {");
				dao.add("			"+tabela.getNomeBanco()+".set"+c.getForenkey().getClasseReferencia()+"("+c.getForenkey().getClasseReferencia()+"DAO.updateCon("+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"(),con));");
				dao.add("			}");
			}
		}
		dao.add("			con.pst = con.conn");
		
		
		sql = update+");";
		System.out.println(sql);
		
		dao.add("					.prepareStatement(\""+sql);
		
		cont = 0;
		id = false;
		for (Coluna c : tabela.getColunas()) {
			if (c.isChave() && c.getNomeBanco().equalsIgnoreCase("id")){
				id=true;
				continue;
			}
			cont++;
			if(c.getForenkey()!=null){
				dao.add("			con.pst.setInt("+cont+", "+tabela.getNomeBanco()+".get"+c.getForenkey().getClasseReferencia()+"().getId());");
			}else{
				if(c.getTipoDado().contains("char")
						|| c.getTipoDado().contains("text")){
					dao.add("			con.pst.setString("+cont+", "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"());");
				}
				
				else if (c.getTipoDado().contains("boolean")) {
					dao.add("			con.pst.setBoolean("+cont+", "+tabela.getNomeBanco()+".is"+c.getNomeSet()+"());");
				} else if (c.getTipoDado().contains("int")) {
					dao.add("			con.pst.setInt("+cont+", "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"());");
				
				} else if (c.getTipoDado().contains("num")
						|| c.getTipoDado().contains("double")
						|| c.getTipoDado().contains("ARRAY")) {
					
					dao.add("			con.pst.setDouble("+cont+", "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"());");
				} else if (c.getTipoDado().contains("date")) {
					dao.add("			con.pst.setDate("+cont+", DatasUteis.formataData( "+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()));");
				} else if( c.getTipoDado().contains("time")){
					dao.add("			con.pst.setTimestamp("+cont+", DatasUteis.formataAgora());");
				}
				
				
			}
		}
		dao.add("			System.out.println(con.pst.toString());");
		dao.add("			con.pst.executeUpdate();");
		
		for (Lista l : listas) {
			if(l.getClasse().equalsIgnoreCase(tabela.getNomeBanco())){
		
		dao.add("			if("+tabela.getNomeBanco()+"."+l.getGet()+".size()!=0){");
		dao.add("    			"+l.getModel()+"DAO.deleteCon("+tabela.getNomeBanco()+".getId(),con);");
		dao.add("    			insertMany("+tabela.getNomeBanco()+", con);");
								dao.add("  } ");
			}
		}
		dao.add("       return "+tabela.getNomeBanco()+";");
		dao.add("	}");
		dao.add("	");
		dao.add("	");
		
		/**
		 * Aqyui abixo select
		 */
		
		dao.add("	");
		dao.add("	");
		dao.add("	public static "+tabela.getNome()+" select(int id) {");
		dao.add("		"+tabela.getNome()+" "+tabela.getNomeBanco()+" = new "+tabela.getNome()+"();");		
		dao.add("		LeXML.ler();");
		dao.add("			Conexao con = new Conexao();");
		dao.add("			try {");
		dao.add("");
		dao.add("				con.conectar(Constantes.base, Constantes.local, Constantes.user,");
		dao.add("					Constantes.senha);");
		dao.add("				con.pst = con.conn.prepareStatement(\"select "+select+ " from "+tabela.getNomeBanco()+" where id = \" + id+\";\");");
		dao.add("				con.rs = con.pst.executeQuery();");
		dao.add("				System.out.println(\"SQL--> \"+con.pst.toString());");
		
		for (Coluna c : tabela.getColunas()) {
			if(c.getForenkey()!=null){
				dao.add("					"+c.getForenkey().getClasseReferencia()+" " + c.getForenkey().getTabelaReferencia()+" = new "+ c.getForenkey().getClasseReferencia()+"();");
			}
		}
		dao.add("				while (con.rs.next()) {");
		
		cont = 0;
		for (Coluna c : tabela.getColunas()) {
			cont++;
			if(c.getForenkey()!=null){
				dao.add("					"+c.getForenkey().getTabelaReferencia()+".setId(con.rs.getInt("+cont+"));");
			}else{
				if(c.getTipoDado().contains("char")
						|| c.getTipoDado().contains("text")){
					dao.add("					"+tabela.getNomeBanco()+".set"+c.getNomeSet()+"(con.rs.getString("+cont+"));");
				}
				
				else if (c.getTipoDado().contains("boolean")) {
					dao.add("					"+tabela.getNomeBanco()+".set"+c.getNomeSet()+"(con.rs.getBoolean("+cont+"));");
				} else if (c.getTipoDado().contains("int")) {
					dao.add("					"+tabela.getNomeBanco()+".set"+c.getNomeSet()+"(con.rs.getInt("+cont+"));");
				} else if (c.getTipoDado().contains("num")
						|| c.getTipoDado().contains("double")
						|| c.getTipoDado().contains("ARRAY")) {
					dao.add("					"+tabela.getNomeBanco()+".set"+c.getNomeSet()+"(con.rs.getDouble("+cont+"));");
				} else if (c.getTipoDado().contains("date")) {
					dao.add("					"+tabela.getNomeBanco()+".set"+c.getNomeSet()+"(DatasUteis.formataData(con.rs.getDate("+cont+")));");
				} else if( c.getTipoDado().contains("time")){
					dao.add("					"+tabela.getNomeBanco()+".set"+c.getNomeSet()+"(DatasUteis.formataAgora(con.rs.getTimestamp("+cont+")));");
				}
				
			}
		}
		dao.add("			}");
		
		for (Coluna c : tabela.getColunas()) {
			if(c.getForenkey()!=null){
				dao.add("					"+tabela.getNomeBanco() +".set"+c.getForenkey().getClasseReferencia()+"("+c.getForenkey().getClasseReferencia()+"DAO.select("+c.getForenkey().getTabelaReferencia()+".getId()));");

			}
		}
		
		for (Lista l : listas) {
			if(l.getClasse().equalsIgnoreCase(tabela.getNomeBanco())){
				dao.add("		"+tabela.getNomeBanco()+".set"+l.getModel()+"("+l.getTabelaF().getNomeJava()+"DAO.select("+tabela.getNomeBanco()+".getId()));");
			}
		}
		
		
		
		dao.add("		} catch (SQLException e) {");
		dao.add("			e.printStackTrace();");
		dao.add("		} catch (Exception e) {");
		dao.add("				e.printStackTrace();");
		dao.add("		} finally {");
		dao.add("				con.desconectar();");
		dao.add("		}");
		dao.add("		return "+tabela.getNomeBanco()+";");
		dao.add("	}");
		dao.add("	");
		dao.add("	");
		
		// selectLazy
		
		dao.add("	");
		dao.add("	");
		dao.add("	");
		dao.add("	");
		dao.add("	public static List<"+tabela.getNome()+"> selectLazy("+tabela.getNome()+" "+tabela.getNomeBanco()+") throws ParseException {");
		dao.add("			String where =\" where 1 = 1 and \";");
		dao.add("			String and = \" and \";");
		dao.add("				if("+tabela.getNomeBanco()+".getId()!=null){");
		dao.add("					where = where +\" id = \" +"+tabela.getNomeBanco()+".getId() ;");
		dao.add("				}else{");
		
		for (Coluna c : tabela.getColunas()) {
			cont++;
			if(c.getForenkey()!=null){
				continue;
			}else{
				if(c.getTipoDado().contains("char")
						|| c.getTipoDado().contains("text")){
					dao.add("				if("+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()!=null){");
					dao.add("					where = where +\""+c.getNomeBanco()+"  = '\"+"+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()+\"'\"+ and;");
					dao.add("				}");
				}
				
				else if (c.getTipoDado().contains("boolean")) {
					dao.add("				if("+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()!=null){");
					dao.add("					where = where +\""+c.getNomeBanco()+"  = \"+"+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()+ and;");
					dao.add("				}");
				} else if (c.getTipoDado().contains("int")) {
					dao.add("				if("+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()!=null){");
					dao.add("					where = where +\""+c.getNomeBanco()+"  = \"+"+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()+ and;");
					dao.add("				}");
				} else if (c.getTipoDado().contains("num")
						|| c.getTipoDado().contains("double")
						|| c.getTipoDado().contains("ARRAY")) {
					dao.add("				"+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()!=null){");
					dao.add("					where = where +\""+c.getNomeBanco()+"  = \"+"+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()+ and;");
					dao.add("				}");
				} else if (c.getTipoDado().contains("date")) {
					dao.add("				if("+tabela.getNomeBanco()+".get"+c.getNomeSet()+"()!=null){");
					dao.add("					where = where +\""+c.getNomeBanco()+"  = \"+DatasUteis.formataDataWhere("+tabela.getNomeBanco()+".get"+c.getNomeSet()+"())+\" and\";");
					dao.add("				}");
				}
			}
		}
		dao.add("				where = where.substring(0,where.length()-4);");
		dao.add("			}");
		
		dao.add("			List<"+tabela.getNome()+"> list"+tabela.getNomeBanco()+" = new ArrayList<"+tabela.getNome()+">();");		
		dao.add("			LeXML.ler();");
		dao.add("			Conexao con = new Conexao();");
		dao.add("			try {");
		dao.add("");
		dao.add("				con.conectar(Constantes.base, Constantes.local, Constantes.user,");
		dao.add("					Constantes.senha);");
		dao.add("				con.pst = con.conn.prepareStatement(\"select "+select+ " from "+tabela.getNomeBanco()+" \" + where +\" ;\");");
		dao.add("				con.rs = con.pst.executeQuery();");
		dao.add("				System.out.println(\"SQL--> \"+con.pst.toString());");
		dao.add("				while (con.rs.next()) {");
		dao.add("				"+tabela.getNome()+" "+tabela.getNomeBanco()+"Aux = new "+tabela.getNome()+"();");
		
		
		cont = 0;
		for (Coluna c : tabela.getColunas()) {
			cont++;
			if(c.getForenkey()!=null){
				continue;
			}else{
				if(c.getTipoDado().contains("char")
						|| c.getTipoDado().contains("text")){
					dao.add("					"+tabela.getNomeBanco()+"Aux.set"+c.getNomeSet()+"(con.rs.getString("+cont+"));");
				}
				
				else if (c.getTipoDado().contains("boolean")) {
					dao.add("					"+tabela.getNomeBanco()+"Aux.set"+c.getNomeSet()+"(con.rs.getBoolean("+cont+"));");
				} else if (c.getTipoDado().contains("int")) {
					dao.add("					"+tabela.getNomeBanco()+"Aux.set"+c.getNomeSet()+"(con.rs.getInt("+cont+"));");
				} else if (c.getTipoDado().contains("num")
						|| c.getTipoDado().contains("double")
						|| c.getTipoDado().contains("ARRAY")) {
					dao.add("					"+tabela.getNomeBanco()+"Aux.set"+c.getNomeSet()+"(con.rs.getDouble("+cont+"));");
				} else if (c.getTipoDado().contains("date")) {
					dao.add("					"+tabela.getNomeBanco()+"Aux.set"+c.getNomeSet()+"(DatasUteis.formataData(con.rs.getDate("+cont+")));");
				} else if( c.getTipoDado().contains("time")){
					dao.add("					"+tabela.getNomeBanco()+"Aux.set"+c.getNomeSet()+"(DatasUteis.formataAgora(con.rs.getTimestamp("+cont+")));");
				}
				
				
			}
			
		}
		dao.add("		list"+tabela.getNomeBanco()+".add("+tabela.getNomeBanco()+"Aux);");
		dao.add("		}");
		dao.add("		} catch (SQLException e) {");
		dao.add("			e.printStackTrace();");
		dao.add("		} catch (Exception e) {");
		dao.add("				e.printStackTrace();");
		dao.add("		} finally {");
		dao.add("				con.desconectar();");
		dao.add("		}");
		dao.add("		return list"+tabela.getNomeBanco()+";");
		dao.add("	}");
		dao.add("	");
		dao.add("	");
		
		
		/**
		 * delete
		 */
		
		
		 dao.add(" public static void delete(int id) {");
		 dao.add(" 		LeXML.ler();");
		 dao.add(" 		Conexao con = new Conexao();");
		 dao.add(" 		try {");
		 dao.add("");
		 dao.add(" 			con.conectar(Constantes.base, Constantes.local,Constantes.user,");
		 dao.add(" 			Constantes.senha);");
		 dao.add("			deleteCon(id, con);");
		 dao.add("			con.commit();");
		 dao.add("		} catch (Exception e) {");
		 dao.add("			try {");
		 dao.add("				con.rollback();");
		 dao.add("			} catch (SQLException e1) {");
		 dao.add("				e1.printStackTrace();");
		 dao.add("			}");
		 dao.add("				e.printStackTrace();");
		 dao.add("		}finally{");
		 dao.add("			con.desconectar();");
		 dao.add("		}	");
		 dao.add("}");
		 dao.add("");
		 dao.add("	public static void deleteCon(int id,Conexao con) throws SQLException , ParseException, java.text.ParseException{");
		 dao.add("		con.pst = con.conn.prepareStatement(\"delete from "+tabela.getNomeBanco()+" where "+tabela.getColunas().get(0).getNomeBanco()+" = \" + id+\";\");");
		 dao.add("		con.pst.executeUpdate();");
		 dao.add("		System.out.println(\"SQL--> \"+con.pst.toString());");
		 dao.add("");
		 dao.add("	}");
		 dao.add("	}");
		
		GeradorArquivos.criarDAO(tabela.getNome() + "DAO.java", dao);
	}

	private static void criarModel(Tabela tabela, List<String> model,
			List<Lista> listas) {
		model.add("package revert.model;");
		for (Coluna coluna : tabela.getColunas()) {
			if (coluna.getTipoDado().contains("date")
					|| coluna.getTipoDado().contains("time")) {
				model.add("import java.util.Date;");
				// break;
			}
		}
		for (Lista lista : listas) {
			if (lista.getClasse().equalsIgnoreCase(tabela.getNomeBanco())) {
				model.add("import java.util.List;");
			}
		}
		model.add("");
		model.add("\npublic class " + tabela.getNome() + " {");
		model.add("");
		model.add("");

		for (Coluna coluna : tabela.getColunas()) {
			if (coluna.getForenkey() != null) {
				model.add("private "
						+ coluna.getForenkey().getClasseReferencia() + " "
						+ coluna.getForenkey().getCampo() + ";");
			} else if (coluna.getTipoDado().contains("boolean")) {
				model.add("private boolean " + coluna.getNomeJava() + ";");
			} else if (coluna.getTipoDado().contains("int")) {
				model.add("private Integer " + coluna.getNomeJava() + ";");
			} else if (coluna.getTipoDado().contains("char")
					|| coluna.getTipoDado().contains("text")) {
				model.add("private String " + coluna.getNomeJava() + ";");
			} else if (coluna.getTipoDado().contains("num")
					|| coluna.getTipoDado().contains("double")
					|| coluna.getTipoDado().contains("ARRAY")) {
				model.add("private Double " + coluna.getNomeJava() + ";");
			} else if (coluna.getTipoDado().contains("date")
					|| coluna.getTipoDado().contains("time")) {
				model.add("private String " + coluna.getNomeJava() + ";");
			}
		}
		for (Lista lista : listas) {
			if (lista.getClasse().equalsIgnoreCase(tabela.getNomeBanco())) {
				model.add(lista.getDeclaracao());
			}
		}
		model.add("\n\npublic " + tabela.getNome() + "() {}");

		for (Lista lista : listas) {
			if (lista.getClasse().equalsIgnoreCase(tabela.getNomeBanco())) {
				model.add(lista.getMetodo());
			}
		}

		for (Coluna coluna : tabela.getColunas()) {
			if (coluna.getForenkey() != null) {
				model.add("");
				model.add(" public "
						+ coluna.getForenkey().getClasseReferencia() + " get"
						+ coluna.getForenkey().getClasseReferencia() + "() {");
				model.add("        return " + coluna.getForenkey().getCampo()
						+ ";");
				model.add("  }");
				model.add("");
				model.add("  public void set"
						+ coluna.getForenkey().getClasseReferencia() + "("
						+ coluna.getForenkey().getClasseReferencia() + " "
						+ coluna.getForenkey().getCampo() + ") {");
				model.add("      this." + coluna.getForenkey().getCampo()
						+ " = " + coluna.getForenkey().getCampo() + ";");
				model.add("    }");
			} else if (coluna.getTipoDado().contains("boolean")) {
				model.add("");
				model.add("public boolean is" + coluna.getNomeSet() + "() {");
				model.add("      return " + coluna.getNomeJava() + ";");
				model.add("  }");
				model.add("");
				model.add(" public void set" + coluna.getNomeSet()
						+ "(boolean " + coluna.getNomeJava() + ") {");
				model.add("    this." + coluna.getNomeJava() + " = "
						+ coluna.getNomeJava() + ";");
				model.add("   }");
			} else if (coluna.getTipoDado().contains("int")) {
				model.add("");
				model.add(" public Integer get" + coluna.getNomeSet() + "() {");
				model.add("        return " + coluna.getNomeJava() + ";");
				model.add("  }");
				model.add("");
				model.add("  public void set" + coluna.getNomeSet()
						+ "(Integer " + coluna.getNomeJava() + ") {");
				model.add("      this." + coluna.getNomeJava() + " = "
						+ coluna.getNomeJava() + ";");
				model.add("    }");
			} else if (coluna.getTipoDado().contains("char")
					|| coluna.getTipoDado().contains("text")) {
				model.add("");
				model.add(" public String get" + coluna.getNomeSet() + "() {");
				model.add("        return " + coluna.getNomeJava() + ";");
				model.add("  }");
				model.add("");
				model.add("  public void set" + coluna.getNomeSet()
						+ "(String " + coluna.getNomeJava() + ") {");
				model.add("      this." + coluna.getNomeJava() + " = "
						+ coluna.getNomeJava() + ";");
				model.add("    }");
			} else if (coluna.getTipoDado().contains("num")
					|| coluna.getTipoDado().contains("double")
					|| coluna.getTipoDado().contains("ARRAY")) {
				model.add("");
				model.add(" public Double get" + coluna.getNomeSet() + "() {");
				model.add("        return " + coluna.getNomeJava() + ";");
				model.add("  }");
				model.add("");
				model.add("  public void set" + coluna.getNomeSet()
						+ "(Double " + coluna.getNomeJava() + ") {");
				model.add("      this." + coluna.getNomeJava() + " = "
						+ coluna.getNomeJava() + ";");
				model.add("    }");
			} else if (coluna.getTipoDado().contains("time")
					|| coluna.getTipoDado().contains("date")) {
				model.add("");
				model.add(" public String get" + coluna.getNomeSet() + "() {");
				model.add("        return " + coluna.getNomeJava() + ";");
				model.add("  }");
				model.add("");
				model.add("  public void set" + coluna.getNomeSet() + "(String "
						+ coluna.getNomeJava() + ") {");
				model.add("      this." + coluna.getNomeJava() + " = "
						+ coluna.getNomeJava() + ";");
				model.add("    }");
			}
		}
		model.add("}");
		GeradorArquivos.criarModel(tabela.getNome() + ".java", model);
	}

	
	
	public static void criaLista(List<Lista> listas, Tabela tabela) {
		Lista l = criaLista(tabela);
		listas.add(l);
	}

	private static Lista criaLista(Tabela tabela) {
		String metodo;
		String declaracao;
		metodo = "";
		declaracao = "";
		String s[] = tabela.getNomeBanco().split("_m_");
		System.out.println("entidade: " + s[0]);
		System.out.println(s[1].substring(0, 1).toUpperCase());
		s[1] = s[1].replaceFirst(s[1].substring(0, 1), s[1].substring(0, 1)
				.toUpperCase());
		System.out.println("lista: " + s[1]);

		declaracao = "private List<" + s[1] + "> lista" + s[1] + ";\n";
		metodo = metodo + "\n public void set" + s[1] + "(List<" + s[1]
				+ "> lista" + s[1] + "){\n	" + " this.lista" + s[1] + "= lista"
				+ s[1] + ";\n }";

		metodo = metodo + "\n public List<" + s[1] + "> get" + s[1] + "(){\n	"
				+ " return " + "lista" + s[1] + ";\n }\n";
		System.out.println(metodo);
		Lista l = new Lista(s[0], metodo, declaracao);
		l.setGet("get" + s[1] + "()");
		l.setSet("set" + s[1] + "(");
		l.setModel(s[1]);
		l.setTabelaF(tabela);
		l.setTabela(tabela.getNomeBanco());
		return l;
	}

}
